#pragma once

#include <opencv2/opencv.hpp>
#include <iostream>

constexpr auto MaxMultiple = 3;

class _DemoImageScalingClass
{
public:
	cv::Mat srcImage, resultImage;
	int desizeWidth, desizeHigh;
	int fx, fy;
public:
	_DemoImageScalingClass(int fx = 100, int fy = 100) :fx(fx), fy(fy) {}
};

class _DemoImageRotateClass
{
public:
	cv::Mat srcImage, resultImage, M;
	int rotateAngele, scale;
public:
	_DemoImageRotateClass(cv::Mat srcImage, double rotateAngele = 0, double scale = 100)
		:srcImage(srcImage), rotateAngele(rotateAngele), scale(scale) {}
};

class _DemoImageBorderPaddingClass:public _DemoImageRotateClass
{
public:
	int paddingMode;
public:
	_DemoImageBorderPaddingClass(cv::Mat srcImage, double rotateAngele = 0, double scale = 100, int mode = cv::BorderTypes::BORDER_CONSTANT)
		:_DemoImageRotateClass(srcImage, rotateAngele, scale), paddingMode(mode) {}
};

void demo_ImageScaling(void);
void demo_imageFlip(void);
void demo_warpAffine(void);
void demo_imageRotate(void);
void demo_getAffineTransform(void);
void demo_borderPadding(void);
void demo_perspectiveTransform(void);

void _demo_imageScalingCallback(int pos, void* userdata);
void _demo_imageRotateCallback(int pos, void* userdata);
void _demo_borderPaddingCallback(int pos, void* userdata);